home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / minix / up1510b.tgz / up1510b / src / commands / rm.c < prev    next >
C/C++ Source or Header  |  1990-07-19  |  3KB  |  153 lines

  1. /* rm - remove files            Author: Adri Koppes */
  2.  
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <sys/dir.h>
  6.  
  7. int errors = 0;
  8. int fflag = 0;
  9. int iflag = 0;
  10. int rflag = 0;
  11. int exstatus;
  12.  
  13. main(argc, argv)
  14. int argc;
  15. char *argv[];
  16. {
  17.   char *opt;
  18.  
  19.   if (argc < 2) usage();
  20.   *++argv;
  21.   --argc;
  22.   while (**argv == '-') {
  23.     opt = *argv;
  24.     while (*++opt != '\0') switch (*opt) {
  25.             case 'f':    fflag++;    break;
  26.             case 'i':    iflag++;    break;
  27.             case 'r':    rflag++;    break;
  28.             default:
  29.             std_err("rm: unknown option\n");
  30.             usage();
  31.             break;
  32.         }
  33.     argc--;
  34.     *++argv;
  35.   }
  36.   if (argc < 1) usage();
  37.   while (argc--) remove(*argv++);
  38.   exstatus = (errors == 0 ? 0 : 1);
  39.   if (fflag) exstatus = 0;
  40.   exit(exstatus);
  41. }
  42.  
  43. usage()
  44. {
  45.   std_err("Usage: rm [-fir] file\n");
  46.   exit(1);
  47. }
  48.  
  49. remove(name)
  50. char *name;
  51. {
  52.   struct stat s;
  53.   struct direct d;
  54.   char rname[128], *strcpy(), *strcat();
  55.   int fd;
  56.  
  57.   if (stat(name, &s)) {
  58.     if (!fflag) stderr3("rm: ", name, " non-existent\n");
  59.     errors++;
  60.     return;
  61.   }
  62.   if (iflag) {
  63.     stderr3("rm: remove ", name, "? ");
  64.     if (!confirm()) return;
  65.   }
  66.   if ((s.st_mode & S_IFMT) == S_IFDIR) {
  67.     if (rflag) {
  68.         if ((fd = open(name, 0)) < 0) {
  69.             if (!fflag) stderr3("rm: can't open ", name, "\n");
  70.             errors++;
  71.             return;
  72.         }
  73.         while (read(fd, (char *) &d, sizeof(struct direct)) > 0) {
  74.             if (d.d_ino && strcmp("..", d.d_name) && strcmp(".", d.d_name)) {
  75.                 strcpy(rname, name);
  76.                 strcat(rname, "/");
  77.                 strncat(rname, d.d_name, DIRSIZ);
  78.                 remove(rname);
  79.             }
  80.         }
  81.         close(fd);
  82.         rem_dir(name);
  83.     } else {
  84.         if (!fflag) stderr3("rm: ", name, " is a directory\n");
  85.         errors++;
  86.         return;
  87.     }
  88.   } else {
  89.     if (access(name, 2) && !fflag) {
  90.         stderr3("rm: remove ", name, " (mode = ");
  91.         octal(s.st_mode & 0777);
  92.         std_err(") ? ");
  93.         if (!confirm()) return;
  94.     }
  95.     if (unlink(name)) {
  96.         if (!fflag) stderr3("rm: ", name, " not removed\n");
  97.         errors++;
  98.     }
  99.   }
  100. }
  101.  
  102. rem_dir(name)
  103. char *name;
  104. {
  105.   int status;
  106.  
  107.   switch (fork()) {
  108.       case -1:
  109.     std_err("rm: can't fork\n");
  110.     errors++;
  111.     return;
  112.       case 0:
  113.     execl("/bin/rmdir", "rmdir", name, (char *) 0);
  114.     execl("/usr/bin/rmdir", "rmdir", name, (char *) 0);
  115.     std_err("rm: can't exec rmdir\n");
  116.     exit(1);
  117.       default:
  118.     wait(&status);
  119.     errors += status;
  120.   }
  121. }
  122.  
  123. confirm()
  124. {
  125.   char c, t;
  126.   read(0, &c, 1);
  127.   t = c;
  128.   do
  129.     read(0, &t, 1);
  130.   while (t != '\n' && t != -1);
  131.   return(c == 'y' || c == 'Y');
  132. }
  133.  
  134. octal(num)
  135. unsigned int num;
  136. {
  137.   char a[4];
  138.  
  139.   a[0] = (((num >> 6) & 7) + '0');
  140.   a[1] = (((num >> 3) & 7) + '0');
  141.   a[2] = ((num & 7) + '0');
  142.   a[3] = 0;
  143.   std_err(a);
  144. }
  145.  
  146. stderr3(s1, s2, s3)
  147. char *s1, *s2, *s3;
  148. {
  149.   std_err(s1);
  150.   std_err(s2);
  151.   std_err(s3);
  152. }
  153.